1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.base;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20
21 import com.google.common.annotations.Beta;
22 import com.google.common.annotations.GwtCompatible;
23 import com.google.common.annotations.GwtIncompatible;
24
25 import java.io.Serializable;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Collection;
29 import java.util.List;
30 import java.util.regex.Pattern;
31
32 import javax.annotation.Nullable;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 @GwtCompatible(emulated = true)
48 public final class Predicates {
49 private Predicates() {}
50
51
52
53
54
55
56
57 @GwtCompatible(serializable = true)
58 public static <T> Predicate<T> alwaysTrue() {
59 return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
60 }
61
62
63
64
65 @GwtCompatible(serializable = true)
66 public static <T> Predicate<T> alwaysFalse() {
67 return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
68 }
69
70
71
72
73
74 @GwtCompatible(serializable = true)
75 public static <T> Predicate<T> isNull() {
76 return ObjectPredicate.IS_NULL.withNarrowedType();
77 }
78
79
80
81
82
83 @GwtCompatible(serializable = true)
84 public static <T> Predicate<T> notNull() {
85 return ObjectPredicate.NOT_NULL.withNarrowedType();
86 }
87
88
89
90
91
92 public static <T> Predicate<T> not(Predicate<T> predicate) {
93 return new NotPredicate<T>(predicate);
94 }
95
96
97
98
99
100
101
102
103
104
105 public static <T> Predicate<T> and(
106 Iterable<? extends Predicate<? super T>> components) {
107 return new AndPredicate<T>(defensiveCopy(components));
108 }
109
110
111
112
113
114
115
116
117
118
119 public static <T> Predicate<T> and(Predicate<? super T>... components) {
120 return new AndPredicate<T>(defensiveCopy(components));
121 }
122
123
124
125
126
127
128
129 public static <T> Predicate<T> and(Predicate<? super T> first,
130 Predicate<? super T> second) {
131 return new AndPredicate<T>(Predicates.<T>asList(
132 checkNotNull(first), checkNotNull(second)));
133 }
134
135
136
137
138
139
140
141
142
143
144 public static <T> Predicate<T> or(
145 Iterable<? extends Predicate<? super T>> components) {
146 return new OrPredicate<T>(defensiveCopy(components));
147 }
148
149
150
151
152
153
154
155
156
157
158 public static <T> Predicate<T> or(Predicate<? super T>... components) {
159 return new OrPredicate<T>(defensiveCopy(components));
160 }
161
162
163
164
165
166
167
168 public static <T> Predicate<T> or(
169 Predicate<? super T> first, Predicate<? super T> second) {
170 return new OrPredicate<T>(Predicates.<T>asList(
171 checkNotNull(first), checkNotNull(second)));
172 }
173
174
175
176
177
178 public static <T> Predicate<T> equalTo(@Nullable T target) {
179 return (target == null)
180 ? Predicates.<T>isNull()
181 : new IsEqualToPredicate<T>(target);
182 }
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 @GwtIncompatible("Class.isInstance")
200 public static Predicate<Object> instanceOf(Class<?> clazz) {
201 return new InstanceOfPredicate(clazz);
202 }
203
204
205
206
207
208
209
210
211 @GwtIncompatible("Class.isAssignableFrom")
212 @Beta
213 public static Predicate<Class<?>> assignableFrom(Class<?> clazz) {
214 return new AssignableFromPredicate(clazz);
215 }
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 public static <T> Predicate<T> in(Collection<? extends T> target) {
231 return new InPredicate<T>(target);
232 }
233
234
235
236
237
238
239
240 public static <A, B> Predicate<A> compose(
241 Predicate<B> predicate, Function<A, ? extends B> function) {
242 return new CompositionPredicate<A, B>(predicate, function);
243 }
244
245
246
247
248
249
250
251
252
253
254 @GwtIncompatible(value = "java.util.regex.Pattern")
255 public static Predicate<CharSequence> containsPattern(String pattern) {
256 return new ContainsPatternFromStringPredicate(pattern);
257 }
258
259
260
261
262
263
264
265
266
267 @GwtIncompatible(value = "java.util.regex.Pattern")
268 public static Predicate<CharSequence> contains(Pattern pattern) {
269 return new ContainsPatternPredicate(pattern);
270 }
271
272
273
274
275 enum ObjectPredicate implements Predicate<Object> {
276
277 ALWAYS_TRUE {
278 @Override public boolean apply(@Nullable Object o) {
279 return true;
280 }
281 @Override public String toString() {
282 return "Predicates.alwaysTrue()";
283 }
284 },
285
286 ALWAYS_FALSE {
287 @Override public boolean apply(@Nullable Object o) {
288 return false;
289 }
290 @Override public String toString() {
291 return "Predicates.alwaysFalse()";
292 }
293 },
294
295 IS_NULL {
296 @Override public boolean apply(@Nullable Object o) {
297 return o == null;
298 }
299 @Override public String toString() {
300 return "Predicates.isNull()";
301 }
302 },
303
304 NOT_NULL {
305 @Override public boolean apply(@Nullable Object o) {
306 return o != null;
307 }
308 @Override public String toString() {
309 return "Predicates.notNull()";
310 }
311 };
312
313 @SuppressWarnings("unchecked")
314 <T> Predicate<T> withNarrowedType() {
315 return (Predicate<T>) this;
316 }
317 }
318
319
320 private static class NotPredicate<T> implements Predicate<T>, Serializable {
321 final Predicate<T> predicate;
322
323 NotPredicate(Predicate<T> predicate) {
324 this.predicate = checkNotNull(predicate);
325 }
326 @Override
327 public boolean apply(@Nullable T t) {
328 return !predicate.apply(t);
329 }
330 @Override public int hashCode() {
331 return ~predicate.hashCode();
332 }
333 @Override public boolean equals(@Nullable Object obj) {
334 if (obj instanceof NotPredicate) {
335 NotPredicate<?> that = (NotPredicate<?>) obj;
336 return predicate.equals(that.predicate);
337 }
338 return false;
339 }
340 @Override public String toString() {
341 return "Predicates.not(" + predicate.toString() + ")";
342 }
343 private static final long serialVersionUID = 0;
344 }
345
346 private static final Joiner COMMA_JOINER = Joiner.on(',');
347
348
349 private static class AndPredicate<T> implements Predicate<T>, Serializable {
350 private final List<? extends Predicate<? super T>> components;
351
352 private AndPredicate(List<? extends Predicate<? super T>> components) {
353 this.components = components;
354 }
355 @Override
356 public boolean apply(@Nullable T t) {
357
358 for (int i = 0; i < components.size(); i++) {
359 if (!components.get(i).apply(t)) {
360 return false;
361 }
362 }
363 return true;
364 }
365 @Override public int hashCode() {
366
367 return components.hashCode() + 0x12472c2c;
368 }
369 @Override public boolean equals(@Nullable Object obj) {
370 if (obj instanceof AndPredicate) {
371 AndPredicate<?> that = (AndPredicate<?>) obj;
372 return components.equals(that.components);
373 }
374 return false;
375 }
376 @Override public String toString() {
377 return "Predicates.and(" + COMMA_JOINER.join(components) + ")";
378 }
379 private static final long serialVersionUID = 0;
380 }
381
382
383 private static class OrPredicate<T> implements Predicate<T>, Serializable {
384 private final List<? extends Predicate<? super T>> components;
385
386 private OrPredicate(List<? extends Predicate<? super T>> components) {
387 this.components = components;
388 }
389 @Override
390 public boolean apply(@Nullable T t) {
391
392 for (int i = 0; i < components.size(); i++) {
393 if (components.get(i).apply(t)) {
394 return true;
395 }
396 }
397 return false;
398 }
399 @Override public int hashCode() {
400
401 return components.hashCode() + 0x053c91cf;
402 }
403 @Override public boolean equals(@Nullable Object obj) {
404 if (obj instanceof OrPredicate) {
405 OrPredicate<?> that = (OrPredicate<?>) obj;
406 return components.equals(that.components);
407 }
408 return false;
409 }
410 @Override public String toString() {
411 return "Predicates.or(" + COMMA_JOINER.join(components) + ")";
412 }
413 private static final long serialVersionUID = 0;
414 }
415
416
417 private static class IsEqualToPredicate<T>
418 implements Predicate<T>, Serializable {
419 private final T target;
420
421 private IsEqualToPredicate(T target) {
422 this.target = target;
423 }
424 @Override
425 public boolean apply(T t) {
426 return target.equals(t);
427 }
428 @Override public int hashCode() {
429 return target.hashCode();
430 }
431 @Override public boolean equals(@Nullable Object obj) {
432 if (obj instanceof IsEqualToPredicate) {
433 IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
434 return target.equals(that.target);
435 }
436 return false;
437 }
438 @Override public String toString() {
439 return "Predicates.equalTo(" + target + ")";
440 }
441 private static final long serialVersionUID = 0;
442 }
443
444
445 @GwtIncompatible("Class.isInstance")
446 private static class InstanceOfPredicate
447 implements Predicate<Object>, Serializable {
448 private final Class<?> clazz;
449
450 private InstanceOfPredicate(Class<?> clazz) {
451 this.clazz = checkNotNull(clazz);
452 }
453 @Override
454 public boolean apply(@Nullable Object o) {
455 return clazz.isInstance(o);
456 }
457 @Override public int hashCode() {
458 return clazz.hashCode();
459 }
460 @Override public boolean equals(@Nullable Object obj) {
461 if (obj instanceof InstanceOfPredicate) {
462 InstanceOfPredicate that = (InstanceOfPredicate) obj;
463 return clazz == that.clazz;
464 }
465 return false;
466 }
467 @Override public String toString() {
468 return "Predicates.instanceOf(" + clazz.getName() + ")";
469 }
470 private static final long serialVersionUID = 0;
471 }
472
473
474 @GwtIncompatible("Class.isAssignableFrom")
475 private static class AssignableFromPredicate
476 implements Predicate<Class<?>>, Serializable {
477 private final Class<?> clazz;
478
479 private AssignableFromPredicate(Class<?> clazz) {
480 this.clazz = checkNotNull(clazz);
481 }
482 @Override
483 public boolean apply(Class<?> input) {
484 return clazz.isAssignableFrom(input);
485 }
486 @Override public int hashCode() {
487 return clazz.hashCode();
488 }
489 @Override public boolean equals(@Nullable Object obj) {
490 if (obj instanceof AssignableFromPredicate) {
491 AssignableFromPredicate that = (AssignableFromPredicate) obj;
492 return clazz == that.clazz;
493 }
494 return false;
495 }
496 @Override public String toString() {
497 return "Predicates.assignableFrom(" + clazz.getName() + ")";
498 }
499 private static final long serialVersionUID = 0;
500 }
501
502
503 private static class InPredicate<T> implements Predicate<T>, Serializable {
504 private final Collection<?> target;
505
506 private InPredicate(Collection<?> target) {
507 this.target = checkNotNull(target);
508 }
509
510 @Override
511 public boolean apply(@Nullable T t) {
512 try {
513 return target.contains(t);
514 } catch (NullPointerException e) {
515 return false;
516 } catch (ClassCastException e) {
517 return false;
518 }
519 }
520
521 @Override public boolean equals(@Nullable Object obj) {
522 if (obj instanceof InPredicate) {
523 InPredicate<?> that = (InPredicate<?>) obj;
524 return target.equals(that.target);
525 }
526 return false;
527 }
528
529 @Override public int hashCode() {
530 return target.hashCode();
531 }
532
533 @Override public String toString() {
534 return "Predicates.in(" + target + ")";
535 }
536 private static final long serialVersionUID = 0;
537 }
538
539
540 private static class CompositionPredicate<A, B>
541 implements Predicate<A>, Serializable {
542 final Predicate<B> p;
543 final Function<A, ? extends B> f;
544
545 private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) {
546 this.p = checkNotNull(p);
547 this.f = checkNotNull(f);
548 }
549
550 @Override
551 public boolean apply(@Nullable A a) {
552 return p.apply(f.apply(a));
553 }
554
555 @Override public boolean equals(@Nullable Object obj) {
556 if (obj instanceof CompositionPredicate) {
557 CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
558 return f.equals(that.f) && p.equals(that.p);
559 }
560 return false;
561 }
562
563 @Override public int hashCode() {
564 return f.hashCode() ^ p.hashCode();
565 }
566
567 @Override public String toString() {
568 return p.toString() + "(" + f.toString() + ")";
569 }
570
571 private static final long serialVersionUID = 0;
572 }
573
574
575 @GwtIncompatible("Only used by other GWT-incompatible code.")
576 private static class ContainsPatternPredicate
577 implements Predicate<CharSequence>, Serializable {
578 final Pattern pattern;
579
580 ContainsPatternPredicate(Pattern pattern) {
581 this.pattern = checkNotNull(pattern);
582 }
583
584 @Override
585 public boolean apply(CharSequence t) {
586 return pattern.matcher(t).find();
587 }
588
589 @Override public int hashCode() {
590
591
592
593 return Objects.hashCode(pattern.pattern(), pattern.flags());
594 }
595
596 @Override public boolean equals(@Nullable Object obj) {
597 if (obj instanceof ContainsPatternPredicate) {
598 ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
599
600
601
602 return Objects.equal(pattern.pattern(), that.pattern.pattern())
603 && Objects.equal(pattern.flags(), that.pattern.flags());
604 }
605 return false;
606 }
607
608 @Override public String toString() {
609 String patternString = Objects.toStringHelper(pattern)
610 .add("pattern", pattern.pattern())
611 .add("pattern.flags", pattern.flags())
612 .toString();
613 return "Predicates.contains(" + patternString + ")";
614 }
615
616 private static final long serialVersionUID = 0;
617 }
618
619
620 @GwtIncompatible("Only used by other GWT-incompatible code.")
621 private static class ContainsPatternFromStringPredicate
622 extends ContainsPatternPredicate {
623
624 ContainsPatternFromStringPredicate(String string) {
625 super(Pattern.compile(string));
626 }
627
628 @Override public String toString() {
629 return "Predicates.containsPattern(" + pattern.pattern() + ")";
630 }
631
632 private static final long serialVersionUID = 0;
633 }
634
635 private static <T> List<Predicate<? super T>> asList(
636 Predicate<? super T> first, Predicate<? super T> second) {
637
638 return Arrays.<Predicate<? super T>>asList(first, second);
639 }
640
641 private static <T> List<T> defensiveCopy(T... array) {
642 return defensiveCopy(Arrays.asList(array));
643 }
644
645 static <T> List<T> defensiveCopy(Iterable<T> iterable) {
646 ArrayList<T> list = new ArrayList<T>();
647 for (T element : iterable) {
648 list.add(checkNotNull(element));
649 }
650 return list;
651 }
652 }